/**
 * Pour gérer les portées, la table des symboles de VSL+ est organisée comme 
 * une pile de tables (Hastable en Java, structure de données de type "map").
 * Toute insertion se fait dans la table qui est en tête de pile. La recherche
 *  se fait dans toutes les tables. 
 * Afin d'éviter le calcul à chaque fois que l'on a besoin de la portée courante, 
 * un attribut dérivé la mémorise et est automatiquement mis à jour à chaque changement
 * de portée.
 * 
 * @author MLB
 *
 */

class TableSymboles{
    private TableSymboleElem current_table;
    private int scope_level;
    private int size;
	 
    /**
     * Création d'une table des symboles. La portée courante est zéro.
     *
     */
    public TableSymboles(){
		  size = 1024;
		  current_table = new TableSymboleElem(null,size);
		  scope_level = 0;
    }
	/**
	 * Empilement d'une nouvelle table et incrémentation de la profondeur
	 * d'imbrication.
	 */ 
    public void Enter_Scope(){    	
		  TableSymboleElem t = new TableSymboleElem(current_table,size);
		  current_table = t;
		  scope_level++;
    }
	 /**
	  * Dépilement d'une table et décrémentation de la profondeur d'imbrication
	  *
	  */
    public void Leave_Scope(){   	
		  current_table = current_table.englobante;
		  scope_level--;
    }
	 /**
	  * Recherche de la valeur associée à un nom
	  * @param name: clef de type String
	  * @return Valeur de type Operand3a
	  */
    public Tokatt Lookup(String name){   	
		  return ((Tokatt)current_table.lookup(name));
    }
	 /**
	  * Insertion d'un couple (clef, valeur) dans la table courante
	  * @param name : le nom (String)
	  * @param t : type minimal Operand3a
	  * @return
	  */
    public void Insert(String name, Tokatt t){    	
		  current_table.Insert(name,t);
    }
	 
	 
    public int getScope(){
		  return scope_level;
    }

    public void Dump(){
		  current_table.Dump();
    }

}
